
Beschreibung zum Programm RAMTEST
=================================

Version: 1.2			Version 1.3
Datum:   18.02.2004		07.03.2004
Autor:   Frank Dachselt		Mario Leubner

Das Programm RAMTEST testet die Funktionsfähigkeit von internen und
externen RAM-Modulen im KC85. Die zu testenden RAM-Bereiche werden in
Blöcken zu 16 KByte entsprechend dem Modulkonzept des KC85 verwaltet.

Das Programm liegt als Assemblerquelltext (EDAS) und als fertig
übersetztes MC-Programm RAMTEST.KCC vor. Mit dem fertigen Programm lassen
sich komplette Module und interne Speicherbänke testen, die Assembler-
Version erlaubt darüber hinaus auch das gezielte Testen einzelner Blöcke
der Module. Dazu müssen im Assemblerquelltext des Programms die zu
testenden Blöcke vereinbart werden. Am Beginn des Quelltextes existiert
eine Datenstruktur, die Datensätze der folgenden Form enthält:

SLOT0:  DEFB 03H        ; Modulschacht
        DEFB 00H        ; erste Bl.-#
        DEFB 03H        ; erstes MSTW
        DEFB 04H        ; MSTW-Inkrem.
        DEFB 14         ; Anzahl Bl.
        DEFW 8000H      ; Adresse

Jeder Datensatz enthält die zu testenden RAM-Blöcke für einen
(internen oder externen) Modulschacht. Die Modulschacht-Adresse ist
als erstes Byte anzugeben. Danach folgt eine Blocknummer, ab der die
zu durchlaufenden RAM-Blöcke gezählt werden sollen. Diese Angabe ist
nur für die Anzeige von Bedeutung, um die Blöcke unabhängig vom
Modulsteuerwort zu identifizieren. Das nächste Byte ist das
Modulsteuerwort des ersten zu testenden Blocks in diesem Modul. Der
Wert, der zum Modulsteuerwort addiert werden muss, um den jeweils
nächsten Block einzuschalten, wird im folgenden Byte angegeben. Danach
folgt die Anzahl der Blöcke, die in diesem Modul getestet werden
sollen. Die abschließende Angabe ist die Basisadresse des RAM-Blocks,
Standardwert = 8000H. Alle RAM-Blöcke müssen mit den angegebenen
Modulsteuerworten auf der angegebenen Basisadresse aktiv geschaltet
werden.

Der oben angegebene Datensatz ist für den auf 256 KByte aufgerüsteten
RAM des KC85/4 vorgesehen. Es werden 14 Blöcke zu 16 KByte auf der
internen Moduladresse 03 (RAM8), beginnend mit der logischen
Blocknummer 0 getestet. Das erste Modulsteuerwort ist 03H, das zweite
03H + 04H = 07H, das dritte 07H + 04H = 0FH usw. Die logischen Blöcke
0E und 0F werden nicht getestet, da sie dem RAM0 und dem RAM4
entsprechen.

Beispiele für externe (gesteckte) Module sind im folgenden angegeben:

4 Blöcke des M011 (64 KByte) im Schacht 0C:

SLOT1:  DEFB 0CH        ; Modulschacht
        DEFB 00H        ; erste Bl.-#
        DEFB 03H        ; erstes MSTW
        DEFB 40H        ; MSTW-Inkrem.
        DEFB 4          ; Anzahl Bl.
        DEFW 8000H      ; Adresse

1 Block des M022 (16 KByte) im Schacht F0:

SLOT2:  DEFB F0H        ; Modulschacht
        DEFB 00H        ; erste Bl.-#
        DEFB 83H        ; erstes MSTW
        DEFB 00H        ; MSTW-Inkrem.
        DEFB 1          ; Anzahl Bl.
        DEFW 8000H      ; Adresse

Mit dieser Datenstruktur können auch gezielt einzelne Blöcke oder
Teilbereiche aus größeren Modulen ausgewählt und getestet werden. Die
Anzahl der definierten bzw. zu verwendenden Datensätze ist frei wählbar.
Das Ende der Definitionstabelle wird durch eine abschließende 0
gekennzeichnet. Im Quelltext ist Platz für 20 Datensätze vorgesehen.
(siehe Kommando "TESTM" weiter unten in der Baschreibung!)

Nach der Assemblierung steht im CAOS-Menü das Menüwort "TEST" zur
Verfügung, mit dem das Testprogramm gestartet wird. Zuvor sind alle
nicht im Test verwendeten Module, die den RAM-Bereich der zu testenden
Module (8000H...BFFFH) überdecken können, auszuschalten. Das betrifft
insbesondere den internen RAM8, falls dieser nicht getestet werden
soll. Für einen vollständigen Test empfiehlt es sich allerdings, nicht
nur das zu testende Modul selbst zu verwenden, sondern auch mindestens
ein höher priorisiertes und ein niedriger priorisiertes Modul in die
Testschleife aufzunehmen, um auch die korrekte Funktion der
Prioritätskette zu testen.

Das Testprogramm arbeitet die Datenstruktur in der angegebenen
Reihenfolge zyklisch ab. Während des Tests ist der Bildschirm in zwei
Fenster aufgeteilt. In der obersten Zeile werden zur Kontrolle die im
Test einbezogenen Modulsteckplätze angezeigt. Darunter (Statusfenster)
wird für jeden getesteten Block eine Zeile der Form

        rr mm:bb --> mi:bi I10ESBWPIR

ausgegeben. Die Angaben haben folgende Bedeutung:

        rr ... Nummer des Testdurchlaufs (Runde), beginnend bei 00
        mm ... aktuelle Moduladresse
        bb ... aktuelle Blocknummer
        mi ... zurückgelesene Moduladresse
        bi ... zurückgelesene Blocknummer

Die Zeichen "I10SBWPIR" kennzeichnen die durchgeführten Tests. Falls
während der Tests in einer Speicherzelle ein Fehler erkannt wird,
wechselt das Zeichen die Farbe von weiß in rot und im unteren
Bildschirmteil (Fehlerfenster) erscheint eine Zeile der Form

        rr mm:bb t aaaa dd --> dr # eeee:eeee

Die Angaben haben folgende Bedeutung:

        rr   ... Nummer des Testdurchlaufs (Runde), beginnend bei 00
        mm   ... aktuelle Moduladresse
        bb   ... aktuelle Blocknummer
        t    ... Testmode (I,1,0,E,S,B,W,P)
        aaaa ... Speicheradresse
        dd   ... erwartetes Datenbyte
        dr   ... zurückgelesenes Datenbyte
   eeee:eeee ... laufende Nummer des Fehler (32 Bit)

Im einzelnen werden folgende Tests durchgeführt, die durch jeweils
eines der Zeichen I,1,0,E,S,B,W,P oder R symbolisiert werden:

I ... Blockidentifizierung
Dieser Test liest zunächst aus Basisadresse und Basisadresse+1 die dort
abgelegten Werte mi (Moduladresse) und bi (Blocknummer) zurück und
gibt sie in der Statuszeile aus. Diese Werte stimmen erst ab dem
zweiten Durchlauf mit den erwarteten Werten mm und bb überein. Eine
Abweichung der beiden zurückgelesenen Werte von den erwarteten Werten
hat keine Ausgabe im Fehlerfenster zur Folge, da diese Information im
Statusfenster erscheint. Ab dem zweiten Durchlauf enthalten die
restlichen Bytes des Blocks ein eindeutiges Pseudo-Zufallsmuster, das
zurückgelesen wird. Der Vergleich wird ab dem zweiten Durchlauf
durchgeführt, das führende 'I' in der Testanzeige erscheint deshalb
nicht im ersten Durchlauf.

1 ... alle Bits 1
Der gesamte Speicherblock wird mit dem Datenbyte FFh gefüllt und
zurückgelesen.

0 ... alle Bits 0
Der gesamte Speicherblock wird mit dem Datenbyte 00h gefüllt und
zurückgelesen.

E ... Einzelbit-Tests
Es wird überprüft, ob sich alle Bits einer Speicherzelle einzeln setzen
und rücksetzen lassen. Anschließend wird noch kontrolliert, dass keine
(nur durch ein Adressbit abweichende) benachbarte Speicherzelle beim
Schreiben des Datenbytes FFh mit verändert wird (Übersprechtest).
Dieser Test wird nur für jede 31. Speicherzelle ausgeführt.

S ... aperiodisches Muster (vorwärts)
Der Speicherblock wird ab Adresse 8000h mit einem aperiodischen Muster
der Form

        01 02 02 03 03 03 ...

gefüllt und zurückgelesen.

B ... aperiodisches Muster (rückwärts)
Der Speicherblock wird ab Adresse BFFFh mit einem aperiodischen Muster
der Form

        01 02 02 03 03 03 ...

gefüllt und zurückgelesen.

W ... Schreibschutz
Bei gesetztem Schreibschutzbit wird das Muster des Tests B mit einem
anderen Muster überschrieben. Das anschließende Zurücklesen muss die
Bytes des Testmusters B liefern, ansonsten wird ein Fehler ausgegeben.

P ... Programmabarbeitung
In den Speicherblock wird Programmcode geladen und dort gestartet. Der
Programmcode beginnt ab Adresse 8100H und hat folgende Form:

        34 ... 3C47H-mal ... 34 C9

Der Operationscode 34H entspricht dem Befehl INC (HL), C9H dem Befehl
RET. In die Speicherzelle 8001H wird der Wert 00H geladen und das
Unterprogramm mit HL = 8001H aufgerufen. Nach erfolgreicher
Abarbeitung des Programms wird in die Speicherzelle 8001H der Wert 47H
erwartet. ACHTUNG: Da die fehlerhafte Abarbeitung des Programmcodes auch
zum Absturz des Rechners führen kann, wir dieser Test nur ausgeführt wenn
die vorher für diesen Block absolvierten Tests fehlerfrei waren, ansonsten
wird für den Test ein "-" statt dem "P" angezeigt.

I ... Schreiben der Blockidentifizierung
Das abschießende 'I' in der Testfolge schreibt die Werte mm und bb in
die Speicherzellen 8000H und 8001H und füllt den Rest des Blocks mit
einem eindeutigen Pseudo-Zufallsmuster (16 Bit m-Sequenz mit Startwert
mm:bb). Das Rücklesen erfolgt erst im nächsten Durchlauf am Beginn der
Testfolge für diesen Block (Datenerhalt-Test).

R ... Refresh-Test
Es wird eine Warteschleife abgearbeitet, deren Dauer in
Sekundenschritten wählbar (siehe Kommandozeilen-Parameter) ist. Für
die Dauer dieser Schleife erfolgen keine Schreib-/Lesezugriffe in den
zu testenden Speicherblock. Der Datenerhalt muss während dieser Zeit
allein durch den M1-Zyklus-Refresh gewährleistet werden. Die
Warteschleife ist so dimensioniert, dass für je 1024 M1-Zyklen eine
Zeit von 8,67 ms gebraucht wird.


Kommandozeilen-Parameter:
Dem Programm TEST können bis zu drei Parameter beim Programmaufruf
übergeben werden:

	TEST ff ss rr

Der Vorgabewert für nicht angegebene Parameter ist jeweils 0.

Der Parameter ff beeinflusst die Art der Fehlerausgabe im
Fehlerfenster. Mit zunehmenden Wert ff wird die Ausgabe im
Fehlerfenster beschleunigt, der Informationsgehalt im Gegenzug aber
verringert:

        ff = 0   Paging, wartet nach 14 Zeilen auf Tastenbetätigung
             1   fortlaufendes Scrollen über großes Fehlerfenster
             2   fortlaufende Fehlerausgabe einer Zeile, dafür ist
                 das Statusfenster entsprechend größer
             3   Fensteraufteilung wie bei ff=2, aber nur Ausgabe
                 des Fehlerzählers eeee:eeee

Der Parameter ss legt den Schaltzustand der zu testenden Module fest:

        ss = 0   Die zu testenden Module sind im Normalfall ausgeschaltet.
                 Das jeweils aktuelle Modul wird eingeschaltet und nach dem
                 dazugehörenden Test wieder ausgeschaltet.
             1   Alle zu testenden Module werden zum Beginn einer jeden
                 Runde eingeschaltet. Nach dem dazugehörenden Test wird
                 das aktuelle Modul ausgeschaltet.

Voraussetzung für den Test mit ss = 1 ist, dass alle zu testenden
Module nach Schachtnummern geordnet, beginnend mit der kleinsten, in
die Datenstruktur des Testprogramms eingetragen werden.

Grundsätzlich muss sichergestellt sein, dass kein nicht zu testendes
(aktiv geschaltetes) Modul ein zu testendes Modul überdecken kann. Im
Zweifelsfall sollten alle nicht am Test beteiligten Module zuvor
ausgeschaltet werden. Die internen RAM-Blöcke (RAM4 und RAM8) werden
automatisch durch das Programm geschaltet.

Der Parameter rr legt die Länge der Warteschleife (Test 'R') in
Sekunden fest. Alle Werte von 00 bis FF sind zulässig.

Das Testprogramm kann jederzeit durch Drücken der BRK-Taste
abgebrochen werden. Die Abfrage der BRK-Taste erfolgt jeweils am Ende
der Tests eines Blocks und nach jeder Zeile, die im Fehlerfenster
ausgegeben wird.

--------------------------------------------------------------------------

Das Menüwort "TESTM" im CAOS-Menü dient der automatischen Generierung
von Datensätzen für die Tests mit dem Menüwort "TEST". Wenn komplette
Module getestet werden sollen, ist es also nicht jedes mal erforderlich,
den Assemblerquelltext zu bearbeiten und die Tabellen am Anfang neu zu
schreiben. Dies geht einfacher mit dem Kommando TESTM:

TESTM ohne Argumente durchsucht alle internen und externen Module des KC
und zeigt die gefundenen Module zur Kontrolle an.  Nach maximal 20 Modulen
bricht die Suche ab, da der für die Daten vorgesehene Speicher maximal 20
Module aufnehmen kann.

Es lassen sich aber auch gezielt einzelne oder mehrere Module in den Test
aufnehmen. Dann sind diese einfach als Liste von Argumenten hinter TESTM
anzugeben. Zur Kontrolle wird auch hier wieder angezeigt, welche Module
erkannt und in der Liste aufgenommen wurden. Beispiel:

TESTM 03 04 10 F0 F1

Es werden die internen Speicher RAM8 (Steckplatz 03), RAM4 (Steckplatz 04),
sowie die Module auf Steckplatz 10, F0 und F1 getestet. Bekannte Module,
die automatisch erkannt werden, sind:

RAM4 - 1 oder 2 Ebenen, abhängig von CAOS-Version
RAM8 - 2 oder 14 Ebenen abhängig von Speicherausbau und CAOS-Version
M022 - 16K
M024 - 32K
M011 - 64K
M036 - 128K
M032 - 256K
M034 - 512K
M035 - 1MByte

Nach Ausführung des Kommandos "TESTM" ist nur die Definitionstabelle
erzeugt.  Der eigentliche Test erfolgt erst durch das Kommando "TEST", bei
dem weitere Parameter angegeben werden können.

--------------------------------------------------------------------------

Im CAOS-Menü steht weiterhin das Menüwort "BLIST" zur Verfügung, mit
dem nach Durchführung der Tests eine Fehlerstatistik ausgegeben wird.
Jeder Block, in dem ein Fehler erkannt wurde, erscheint mit einer
Zeile der Form

        mm:bb eeee:eeee [I10ESBWP]

Die Angaben haben folgende Bedeutung:

        mm   ... Moduladresse
        bb   ... Blocknummer
   eeee:eeee ... Anzahl der Fehler, die insgesamt in diesem Block
                 erkannt wurden (32 Bit)
  [I10ESBWP] ... hier erscheinen nur die Zeichen der Tests bei denen
                 in dem Block Fehler aufgetreten sind
